%%%-------------------------------------------------------------------
%%% @author Rain
%%% @copyright (C) 2022, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 05. 7月 2022 10:50
%%%-------------------------------------------------------------------
-module(msg_proto).
-author("Rain").

%% API
-export([bin_msg_to_content/1, pack_msg/2]).


pack_msg(MsgId, Msg) when is_integer(MsgId), is_list(Msg) ->
    StrMsg = lists:flatten(io_lib:format("~p",[Msg])),
    %% {}转换为python的()
    StrMsg1 = re:replace(StrMsg, "{", "(", [global, {return, list}]),
    StrMsg2 = re:replace(StrMsg1, "}", ")", [global, {return, list}]),
    BinMsg = list_to_binary(StrMsg2),
    BinMsgSize = erlang:byte_size(BinMsg),
    Header = <<BinMsgSize:32, MsgId:32>>,
    SendData = <<Header/binary, BinMsg/binary>>,
    SendData;
pack_msg(MsgId, Msg) ->
    Err = io_lib:format("[ERROR] pack_msg error, msg_id ~p msg ~p~n",[MsgId, Msg]),
    throw(Err).

bin_msg_to_content(BinMsg) ->
    StrMsg = binary_to_list(BinMsg),
    %% ()转换为erlang的{}
    StrMsg1 = re:replace(StrMsg, "\\(", "{", [global, {return, list}]),
    StrMsg2 = re:replace(StrMsg1, "\\)", "}", [global, {return, list}]),
    StrMsg3 = re:replace(StrMsg2, "'", "\"", [global, {return, list}]),
    Content = string_to_term(StrMsg3),
    Content.

string_to_term(String) ->
    case erl_scan:string(String++".") of
        {ok, Tokens, _} ->
            case erl_parse:parse_term(Tokens) of
                {ok, Term} -> Term;
                _Err -> undefined
            end;
        _Error ->
            undefined
    end.